﻿#pragma execution_character_set("utf-8")
/**********************************
 * 文件:hmi通信组件 头文件
 * 创建者:华磊
 * 创建时间:2020.11.4
 * copyright:(c)深圳市华友高科有限公司
 * 备注:
 * 修改者:
 **********************************/

#ifndef GLOBALDATA_H
#define GLOBALDATA_H

#include <QMutex>
#include <QString>
#include <QVector>
#include <vector>
#include <string>
#include "filedata.h"
#ifdef BUILD_X86_WINDOWS
#include "../CommunicateDelegate/gSoapFoundation_windows/soapStub.h"
#else
#include "../CommunicateDelegate/gSoapFoundation/soapStub.h"
#endif
#include "communicatedelegate_global.h"
/**
 * @brief The RobotInformation struct　机器人信息结构体
 */
struct RobotBackUpInformation
{
    int RobotId;
    QString RobotName;
};

enum E_UPDATA_TYPE
{
    E_UPDATA_TYPE_NONE=0,
    E_UPDATA_TYPE_NOP=1,
    E_UPDATA_TYPE_COMMON=2,
    E_UPDATA_TYPE_IO=3,
};

struct ControllerTimeHistory
{

    /**
     * @brief powerOnTime			上电时间(hmi自用)
     */
    std::string powerOnTime;

    /**
     * @brief powerOnTime			累计上电时间(hmi自用)
     */
    std::string totalPowerOnTime;

    /**
     * @brief powerOnTime			第一次开机上电时间(hmi自用)
     */
    std::string totalStartOnTime;
    /**
     * @brief servoOnTime			使能时间(hmi自用)
     */
    std::string servoOnTime;
};

// 程序文件操作gsoap开关,1:gsoap　0:ftp
#define GSOAP_OPERATE_PROGRAM_FILE_SWITCH 1

class  GlobalData
{
public:
    GlobalData();

public:
    int setCurrentRobotId(int idIn);
    std::string getCurrentRobotName();
    std::string getCurrentRobotPictureAddress();
    int setUserPassword(std::string passwordIn);
    int getMotorInfo(std::vector<double> &axisTorqueOut, std::vector<double> &axisSpeedOut,
                     std::vector<int>& axisPositionOut, std::vector<int>& axisFollowOffsetOut);
    std::string getSerialNumber();
    std::string getGlobalLockMachTime();
    int getVersionList(std::vector<ComponentVersion > &componentVersionListOut);
    int getControllerTimeHistroy(ControllerTimeHistory &timeHistoryOut);
    int getRobotInfoListLv3(std::vector <CommRobotInfo>  &robotInfoListLv3Out);
    int getAxisUnitAndLimit( std::vector<std::vector <float> > & axisLimitOut,std::vector<int> &axisUnitOut);
//    std::string getCurrentRobotPicAddress();
    int getRobotInfoList(std::vector <CommRobotInfo> & robotInfoListOut);
    QString getServerIp();
    int getFtp(QString &ftpUserNameOut,QString &ftpUserPasswdOut,int &portOut);
    int setFtp(QString ftpUserNameIn,QString ftpUserPasswdIn,int portIn);
    int getVehicleBasicInfo(VehicleBasicInfo &infoOut);
    int getCurrentRunFile(CurrentRunFile &currentRunFileOut);
    int setDefaultUserProgramFileName(std::string nameIn);
    int setServerIp(QString serverIPIn);
    std::string getDefaultUserProgramFileName();
    std::string getCurrentTime();
    UserInfo getUserInfo();
    int setUserInfo(UserInfo userInfoIn);
    int getCurrentArmPosition_decart(PointPro &currentPositionDecartOut);
    int getCurrentArmPosition_joint(PointPro &currentPositionJointOut);
    int getAiAoSiSo(std::vector<bool> &ioDI, std::vector<bool> &ioDo, std::vector<double> &ioai,
                    std::vector<double> &ioao, std::vector<bool> &iosi, std::vector<bool> &ioso);
    int  getPlRegister(std::vector<PlRegStruct > &registerOut);
    int  getTimerRegister(std::vector<double > &registerOut);
    int  getGlobalRegister(std::vector<double> &registerOut);
    int  getLocalRegister(std::vector<double> &registerOut);
    int  getPointRegister(std::vector<PointPro > &registerOut);
    int setUpdatePointCloud(bool isEnable);
    bool isUpdatePointCloudStatus();
//    int setDefaultProgramFile(std::string &defaultUserFile);
    int setCoordinateInfo(std::vector<HmiToolCoordinateInformation > &recvToolCoordinate,
                          std::vector<HmiUserCoordinateInformation > &recvUserCoordinate);
    int setVehicleBasicInfo(VehicleBasicInfo &vehicleInfo);
    int setUpdateLv1(UpdateDataLv1 &updateDataLv1);
    int setUpdateLv2(UpdateDataLv2 &updateDataLv2);
    int setUpdateLv3(UpdateDataLv3 &updateDataLv3);
    int setMessageVector(std::vector<Message > &messageVectorIn);
    int getMessageVector(std::vector<Message > &messageVectorOut);
    int getCurrentRunMainFileName(QString &nameOut);
    int setMapInfo(std::vector<PointCloudData_3D> &pointCloudIn);
    int getMapInfo(std::string &mapNameOut, std::vector<PointCloudData_3D> &pointCloudOut);
    int getCurrentMapName(std::string &mapNameOut);
    int getPointCloud(std::vector<PointCloudData_3D> &pointCloudOut);


public:
    /**
     * @brief gsoapCtrlState            gsoap使用状态(0 LV1 初始状态;1 LV2表示数据接收正常)
     */
    int gsoapCtrlState;

    /**
     * @brief initCtrlState             控制器是否完成初始化的返回
     */
    int initCtrlState;
    /**
     * @brief initHmiState              示教器是否初始化完成
     */
    int initHmiState;

    /**
     * @brief mountSuccess              挂载是否成功
     */
    bool mountSuccess;


    /**
     * @brief currentProductivity       当前产量
     */
    float currentProductivity;
    /**
     * @brief accumulateProductivity    累计产量
     */
    float accumulateProductivity;

    float workpieceRatio; //单件效率

    /**
     * @brief currentRobotID            当前机器人ID 默认0  上电初始为0(自己用)
     */
    int currentRobotID;

    /**
     * @brief msgBoxReturnType          消息弹框的信息反馈:确定?
     */
    int msgBoxReturnType;               //枚举,反馈信息内容()

    /**
     * @brief currentUseAxis            当前使用轴
     */
    int currentUseAxis;

    /**
     * @brief programRunAllow           程序运行初始化时候 第一次先跳转页面,并且弹出提示
     */
    bool programRunAllow;

    /**
     * @brief ioUpdateFlag              LV3 允许标志物. io界面显示时，才会更新。
     */
    E_UPDATA_TYPE ioUpdateFlag;

    /**
     * @brief findFlag                  是否允许继续搜寻IP
     */
    bool findFlag;

    /**
     * @brief usbFlag                   usb是否存在
     */
    bool usbFlag;


    /**
     * @brief isFtpConnectSuccess       FTP是否链接成功
     */
    bool isFtpConnectSuccess;

    /**
     * @brief isUseFtpOrNfs             是否使用FTP服务或NFS服务
     */
    bool isUseFtpOrNfs;




    /**
     * @brief globalSafePointFlag   安全开关是否打开的标志
     */
    int globalSafePointFlag;

    /**
     * @brief globalHandSwitch      使能开关
     */
    int globalHandSwitch;
    /**
     * @brief globalProSpeed        自动运行速度
     */
    float globalProSpeed;
    /**
     * @brief globalManSpeed        手动运行速度
     */
    float globalManSpeed;
    /**
     * @brief globalHandRunStatus   手动运行状态，（手动单步，手动连续）
     */
    int globalHandRunStatus;

    /**
     * @brief globalZeroCtrlFlag    回零的第二个标志位，判断回零状态（正在原点回零，回零完成）
     */
    int globalZeroCtrlFlag;
    /**
     * @brief globalCoordinate      坐标系
     */
    int globalCoordinate;
    /**
     * @brief extAxisFlag           手动页面的标志(右侧fun修改)
     */
    int jogPageIndex;
    /**
     * @brief globalCurrentState    程序的运行状态，（运行，暂停，停止）
     */
    int globalCurrentState;
    int globalCurrentState_motion;//运动模块的状态
    /**
     * @brief globalHandState       程序的运行模式（T1/T2/Auto/EXT）
     */
    int globalHandState;
    /**
     * @brief globalServoState      伺服状态
     */
    int globalServoState;

    /**
     * @brief globalZeroStatus      回零状态（是否回过零，按键Btn显示）
     */
    int globalZeroStatus;
    /**
     * @brief globalLoginStatus     登陆状态,不代表连接状态
     */
    bool globalLoginStatus;


    /**
     * @brief globalRegStatus       注册状态 0注册状态正常1快要过期1个星期2已经过期3永久有效4序列号不正确
     */
    int globalRegStatus;


    /**
     * @brief emergencyStatus       急停状态
     */
    int emergencyStatus;
    /**
     * @brief globalMotorType       电机类型
     */
    int globalMotorType;

    /**
     * @brief globalPosType         点位的保存方式:（0代表X、Y、Z、W、P、R），（1代表Deg）
     */
    int globalPosType;
    /**
     * @brief globalDefaultUserNum  默认的用户坐标
     */
    int globalDefaultUserNum;
    /**
     * @brief globalDefaultToolNum  默认的工具坐标
     */
    int globalDefaultToolNum;

    /**
     * @brief startType             启动方式
     */
    int startType;

    /**
     * @brief currentLanguage       当期语言(自用)
     */
    int currentLanguage; 
    /**
     * @brief editLanguage          编辑程序语言(自用,默认1,英文)
     */
    int editLanguage;


    /**
     * @brief robotAxisCount        机器人轴数
     */
    int robotAxisCount;
    /**
     * @brief extAxisCount          外部轴数．not used
     */
    int extAxisCount;
    int onePageAxisCount;


    /**
     * @brief controllerIsConnected 连接状态
     */
    int controllerIsConnected;


    int mainProgramFileVersion;//当前打开的主程序版本,控制器更新如果用trylock会导致状态不对。

    PositionInfo_hmi vmarkInWorld;//vmark在世界地图的位置

    PositionInfo_hmi vehicleInVmark;//车在ｖmark坐标系的位置(VMark点)

    PositionInfo_hmi vehicleInQrcode;//车在qrcode坐标系的位置(qr点)
    PositionInfo_hmi vehicleInCU1;//车在CU1坐标系的位置(CU1点)

    PositionInfo_hmi vehicleInWorld;//车在世界坐标系位置(普通点)

private:
    void lock();
    void unlock();
    bool tryLock(int timeout);
    bool tryLock();
private:
    /**
     * @brief The UserInfo struct       用户信息
     */
    struct UserInfo userInfo;

    /**
     * @brief ftpUserName               FTP登录用户名
     */
    QString ftpUserName;

    /**
     * @brief ftpUserPasswd             FTP登录用户名密码
     */
    QString ftpUserPasswd;
    /**
     * @brief ftpPort           ftp端口号
     */
    int ftpPort;


    /**
     * @brief The CurrentRunFile struct 当前运行程序
     */
    struct CurrentRunFile currentRunFile;

    /**
     * @brief message               控制器消息
     */
    std::vector<Message > messageVector;

    /**
     * @brief serialNumber          序列号
     */
    std::string serialNumber;
    /**
     * @brief registerNumber        注册码
     */
    std::string registerNumber;
    /**
     * @brief globalLockMachTime    锁机时间
     */
    std::string globalLockMachTime;



    VehicleBasicInfo vehicleBasicInfo;//车体基础信息




    /**
     * @brief mainProgramVersion    控制器版本号
     */
    std::string mainProgramVersion;

    /**
     * @brief componentVersionList  组件版本列表(控制器)
     */
    std::vector<ComponentVersion > componentVersionList;

    /**
     * @brief extAxisLimit          外部轴软限位
     */
    std::vector<AxisLimit >  extAxisLimit;

    /**
     * @brief extAxisUnit           外部轴单位 2017.03.10
     */
    std::vector<int> extAxisUnit;
    std::vector<int> extAxisLogicalType;

    /**
     * @brief currentTime           当前时间
     */
    std::string currentTime;
    /**
     * @brief controllerIp          控制器IP[LV1]
     */
    std::string controllerIp;
    /**
     * @brief controllerMac         控制器MAC[LV1]
     */
    std::string controllerMac;


    /**
     * @brief axisTorque            电机力矩
     */
    std::vector<double> axisTorque;
    /**
     * @brief axisSpeed             电机速度
     */
    std::vector<double> axisSpeed;
    /**
     * @brief axisPosition          电机位置
     */
    std::vector<int> axisPosition;
    /**
     * @brief axisFollowOffset      电机跟随误差
     */
    std::vector<int> axisFollowOffset;

    /**
     * @brief defaultUserFile       缺省程序
     */
    std::string defaultUserFile;

    /**
     * @brief robotInfoList 		机器人信息[LV1]
     */
    std::vector <CommRobotInfo>  robotInfoList;




    struct ControllerTimeHistory timeHistory;
    /**
     * @brief robotInfoList 		机器人信息[LV3] (与LV1区别,这个是刷新显示用)
     */
    std::vector <CommRobotInfo>  robotInfoListLv3;

    std::string currentRobotFileAddress;
//    std::string currentRobotPicAddress;
    /**
     * @brief serverIP                  连接的服务器IP+PORT
     */
    QString serverIP;
    QByteArray serverIPArray;

    /**
     * @brief currentPositionJoint  当前点关节信息
     */
    struct PointPro currentPositionJoint;
    /**
     * @brief currentPositionWorld  当前点世界坐标
     */
    struct PointPro currentPositionWorld;

    /**
     * @brief axisLimit             轴软限位
     */
    std::vector<std::vector <float> >  axisLimit;

    /**
     * @brief axisUnit              轴单位
     */
    std::vector<int> axisUnit;
    /**
     * @brief axisLogicalType 轴类型
     */
    std::vector<int> axisLogicalType;



    //LV3
    /**
     * @brief ioIn                  DI
     */
    std::vector<bool> ioIn;
    /**
     * @brief ioOut                 DO
     */
    std::vector<bool> ioOut;
    /**
     * @brief ai                    AI
     */
    std::vector<double> ai;
    /**
     * @brief ao                    AO
     */
    std::vector<double> ao;
    /**
     * @brief si                    SI
     */
    std::vector<bool> si;
    /**
     * @brief so                    SO
     */
    std::vector<bool> so;
    /**
     * @brief localRegister         局部寄存器
     */
    std::vector<double> localRegister;
    /**
     * @brief globalRegister        全局寄存器
     */
    std::vector<double> globalRegister;
    /**
     * @brief pointRegister         PR
     */
    std::vector<PointPro > pointRegister;
    /**
     * @brief timerRegister         时间寄存器
     */
    std::vector<double>  timerRegister;
    /**
     * @brief plRegister            PL
     */
    std::vector<PlRegStruct > plRegister;


    QMutex usingMutex;

    std::string mapName;
    std::vector<PointCloudData_3D> pointCloud;
    bool    isUpdatePointCloud;
    QMutex mapMutex;//map only use

};

#endif // GLOBALDATA_H
